/* 由 ecpg 处理（回归模式） */
/* 这些包含文件由预处理器添加 */
#include <ecpglib.h>
#include <ecpgerrno.h>
#include <sqlca.h>
/* 自动包含部分结束 */
#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))

#line 1 "num_test.pgc"
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_numeric.h>
#include <decimal.h>


#line 1 "regression.h"






#line 6 "num_test.pgc"



#line 1 "printf_hack.h"
/*
 * print_double(x) 的效果与 printf("%g", x) 一致，但旨在
 * 在所有平台上产生相同的格式。
 */
static void fc_print_double(double fc_x)
{
#ifdef WIN32
	/* 将 Windows 的 3 位指数更改为看起来与其他人相同 */
	char		convert[128];
	int			vallen;

	sprintf(convert, "%g", x);
	vallen = strlen(convert);

	if (vallen >= 6 &&
		convert[vallen - 5] == 'e' &&
		convert[vallen - 3] == '0')
	{
		convert[vallen - 3] = convert[vallen - 2];
		convert[vallen - 2] = convert[vallen - 1];
		convert[vallen - 1] = '\0';
	}

	printf("%s", convert);
#else
	printf("%g", fc_x);
#endif
}

#line 8 "num_test.pgc"



int main(void)
{
	char *fc_text="error\n";
	numeric *fc_value1, *fc_value2, *fc_res;
	/* 执行 SQL 结束声明部分 */
		 
		/* = {0, 0, 0, 0, 0, NULL, NULL} ; */
	
#line 17 "num_test.pgc"
 numeric * fc_des ;
/*
 * 默认连接: con2
 * 非默认连接: con1
 *
 */
#line 19 "num_test.pgc"

	double fc_d;
	long fc_l1, fc_l2;
	int fc_i, fc_min, fc_max;

	ECPGdebug(1, stderr);
	/* 执行 sql 每当发生 sql 错误时 进行 sqlprint ( ) ; */
#line 25 "num_test.pgc"


	{ ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); 
#line 27 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 27 "num_test.pgc"


	{ ECPGsetcommit(__LINE__, "off", NULL);
#line 29 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 29 "num_test.pgc"

	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test ( text char ( 5 ) , num numeric ( 14 , 7 ) )", ECPGt_EOIT, ECPGt_EORT);
#line 30 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 30 "num_test.pgc"


	fc_value1 = PGTYPESnumeric_new();
	PGTYPESnumeric_from_int(1407, fc_value1);
	fc_text = PGTYPESnumeric_to_asc(fc_value1, -1);
	printf("from int = %s\n", fc_text);
	PGTYPESchar_free(fc_text);
	PGTYPESnumeric_free(fc_value1);

	fc_value1 = PGTYPESnumeric_from_asc("2369.7", NULL);
	fc_value2 = PGTYPESnumeric_from_asc("10.0", NULL);
	fc_res = PGTYPESnumeric_new();
	PGTYPESnumeric_add(fc_value1, fc_value2, fc_res);
	fc_text = PGTYPESnumeric_to_asc(fc_res, -1);
	printf("add = %s\n", fc_text);
	PGTYPESchar_free(fc_text);

	PGTYPESnumeric_sub(fc_res, fc_value2, fc_res);
	fc_text = PGTYPESnumeric_to_asc(fc_res, -1);
	printf("sub = %s\n", fc_text);
	PGTYPESchar_free(fc_text);
	PGTYPESnumeric_free(fc_value2);

	fc_des = PGTYPESnumeric_new();
	PGTYPESnumeric_copy(fc_res, fc_des);
	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into test ( text , num ) values ( 'test' , $1  )", 
	ECPGt_numeric,&(fc_des),(long)1,(long)0,sizeof(numeric), 
	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT);
#line 55 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 55 "num_test.pgc"


	fc_value2 = PGTYPESnumeric_from_asc("2369.7", NULL);
	PGTYPESnumeric_mul(fc_value1, fc_value2, fc_res);
	PGTYPESnumeric_free(fc_value2);

	{ ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select num from test where text = 'test'", ECPGt_EOIT, 
	ECPGt_numeric,&(fc_des),(long)1,(long)0,sizeof(numeric), 
	ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 61 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 61 "num_test.pgc"


	PGTYPESnumeric_mul(fc_res, fc_des, fc_res);
	fc_text = PGTYPESnumeric_to_asc(fc_res, -1);
	printf("mul = %s\n", fc_text);
	PGTYPESchar_free(fc_text);
	PGTYPESnumeric_free(fc_des);

	fc_value2 = PGTYPESnumeric_from_asc("10000", NULL);
	PGTYPESnumeric_div(fc_res, fc_value2, fc_res);
	fc_text = PGTYPESnumeric_to_asc(fc_res, -1);
	PGTYPESnumeric_to_double(fc_res, &fc_d);
	printf("div = %s ", fc_text);
	fc_print_double(fc_d);
	printf("\n");

	PGTYPESnumeric_free(fc_value1);
	PGTYPESnumeric_free(fc_value2);

	fc_value1 = PGTYPESnumeric_from_asc("2E7", NULL);
	fc_value2 = PGTYPESnumeric_from_asc("14", NULL);
	fc_i = PGTYPESnumeric_to_long(fc_value1, &fc_l1) | PGTYPESnumeric_to_long(fc_value2, &fc_l2);
	printf("to long(%d) = %ld %ld\n", fc_i, fc_l1, fc_l2);

	PGTYPESchar_free(fc_text);
	PGTYPESnumeric_free(fc_value1);
	PGTYPESnumeric_free(fc_value2);
	PGTYPESnumeric_free(fc_res);

	/* 检查数值到整型的转换 */
	fc_value1 = PGTYPESnumeric_from_asc("-2147483648", NULL);
	PGTYPESnumeric_to_int(fc_value1, &fc_min);
	printf("min int = %d\n", fc_min);
	PGTYPESnumeric_free(fc_value1);

	fc_value2 = PGTYPESnumeric_from_asc("2147483647", NULL);
	PGTYPESnumeric_to_int(fc_value2, &fc_max);
	printf("max int = %d\n", fc_max);
	PGTYPESnumeric_free(fc_value2);

	{ ECPGtrans(__LINE__, NULL, "rollback");
#line 101 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 101 "num_test.pgc"

	{ ECPGdisconnect(__LINE__, "CURRENT");
#line 102 "num_test.pgc"

if (sqlca.sqlcode < 0) sqlprint ( );}
#line 102 "num_test.pgc"


	return 0;
}
